#include<stdio.h>

#define MAX_stu 20

//单个学生
typedef struct
{
    char name[128]; // 姓名
    char sex[5];    // 性别
    short id;       // 学号
    int age;        // 年龄
    int sco;        // 成绩
} stu_data;

// 一个班
typedef struct
{
    stu_data data[MAX_stu]; // 学生   20 代表 20 个座位
    int len;                // 记录学生人数
} stu_class;

//声明
/************************* 增 *************************/
void tail_ins_list(stu_class *class);

/************************* 删 *************************/
void tail_del_list(stu_class *class);

/************************* 改 *************************/
void chan_list(stu_class *class);

/************************* 查 *************************/
int find_list(stu_class *class);

/************************* 排序 *************************/
void sort_list(stu_class *class);

/************************* 打印 *************************/
void printf_Sql_List(stu_class *class);

int main(int argc, char const *argv[])
{
    /*初始化结构体*/
    //创建一个  班级结构体
    stu_class stu={
        .data={
            {"石昊", "男", 1, 18, 120},
            {"萧炎", "男", 2, 18, 110},
            {"牧尘", "男", 3, 18, 115},
            {"林动", "男", 4, 18, 113},
            {"韩立", "男", 5, 18, 105},
        },
        .len=5
    };

    //打印数据
     printf_Sql_List(&stu);
     //删除数据
     tail_del_list(&stu);
     //排序
     sort_list(&stu);
     //打印数据
     printf_Sql_List(&stu);

    return 0;
}

/************************* 增 *************************/
void tail_ins_list(stu_class *class)
{
    //判定是否为空指针
    if(NULL==class)
    {
        puts("你没有传入班级");
        return;
    }

    //判断满
    if(MAX_stu <= class->len)
    {
        puts("满了");
        return;
    }

    //输入数据
    stu_data data;

    //定义标志位
    int flag=0;

    printf("请输入学生数据:\n");

    while(1)
    {
        printf("姓名");
        scanf("%s", data.name);
        printf("性别");
        scanf("%s", data.sex);
        printf("学号");
        scanf("%hd", &data.id);
        printf("年龄");
        scanf("%d", &data.age);
        printf("成绩");
        scanf("%d", &data.sco);

        //判定是否有重复id
        for (size_t i = 0; i < class->len; i++)
        {
            //有重复的内容
            if(data.id == class->data[i].id)
            {
                flag=1;
                break;
            }
        }
        
        if(1==flag)
        {
            //标志位复位
            flag=0;
            printf("有重复学号 请重新输入学生数据:\n");
            continue;
        }

        else
        {
            //插入数据
            class->data[class->len]=data;
            //迭代长度
            class->len++;
            //退出循环
            return;
        }
    }
}

/************************* 删 *************************/
void tail_del_list(stu_class *class)
{
    // 判定是否为空指针
    if (NULL == class)
    {
        puts("你没有传入班级\n");
        return;
    }

    // 判断空
    if (0 >= class->len)
    {
        puts("再删就负数啦\n");
        return;
    }

    // 删除
    class->len--;
}

/************************* 改 *************************/
void chan_list(stu_class *class)
{
    // 判定是否为空指针
    if (NULL == class)
    {
        puts("你没有传入班级\n");
        return;
    }

    // 判断空
    if (0 >= class->len)
    {
        puts("再删就负数啦\n");
        return;
    }

    int index = 0; // 查找到的下标
    int op = 0;    // 选项

    // 查
    index = find_list(class);
    if (-1 == index)
    {
        printf("未找到数据\n");
        return;
    }

    // 修改
    printf("请输入你需要修改的项目:\n");
    printf("1、姓名\n");
    printf("2、性别\n");
    printf("3、学号\n");
    printf("4、年龄\n");
    printf("5、成绩\n");

    scanf("%d", &op);
    switch (op)
    {
    case 1:
        printf("姓名:");
        scanf("%s", class->data[index].name);
        break;
    case 2:
        printf("性别:");
        scanf("%s", class->data[index].sex);
        break;
    case 3:
        printf("学号:");
        scanf("%hd", &class->data[index].id);
        break;
    case 4:
        printf("年龄:");
        scanf("%d", &class->data[index].age);
        break;
    case 5:
        printf("成绩:");
        scanf("%d", &class->data[index].sco);
        break;
    default:
        printf("输入错误\n");
        break;
    }
}

/************************* 查 *************************/
int find_list(stu_class *class)
{
    // 判定是否为空指针
    if (NULL == class)
    {
        puts("你没有传入班级\n");
        return -1;
    }

    // 判断空
    if (0 >= class->len)
    {
        puts("再删就负数啦\n");
        return -1;
    }

    printf("请输入你需要查找的ID号");

    int id = 0;
    scanf("%d", &id);

    for (size_t i = 0; i < class->len; i++)
    {
        if (id == class->data[i].id)
        {
            return i;
        }
    }
    return -1;
}

void sort_list(stu_class *class)
{
    for (size_t i = 0; i < class->len - 1; i++)
    {
        for (size_t j = 0; j < class->len - i - 1; j++)
        {
            if (class->data[j].sco > class->data[j + 1].sco)
            {
                stu_data temp = class->data[j];
                class->data[j] = class->data[j + 1];
                class->data[j + 1] = temp;
            }
        }
    }
}
    /************************* 打印 *************************/   
void printf_Sql_List(stu_class *class)
{
    // 循环
    for (size_t i = 0; i < class->len; i++)
    {
        // 打印数据
        printf("name = %s sex = %s id = %d sco = %d age = %d \n",\
               class->data[i].name, class->data[i].sex, class->data[i].id,\
                class->data[i].age, class->data[i].sco);
    }
}